package com.zhang.listener;


import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.excel.util.ListUtils;
import com.zhang.entity.Customer;
import com.zhang.service.CustomerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;

/*自定义供应商Excel的监听器*/
@Component
public class CustomerListener implements ReadListener<Customer> {

    // 每隔100条存储数据库，实际使用中可根据情况调整，然后清理list ，方便内存回收
    private static final int BATCH_COUNT = 5;
    // 缓存的数据
    private List<Customer> bufList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);

    @Autowired
    private CustomerService customerService;

    public CustomerListener(CustomerService customerService) {
        this.customerService = customerService;
    }

    // 这个每一条数据解析都会来调用
    @Override
    public void invoke(Customer employee, AnalysisContext analysisContext) {
        System.out.println("buflist"+bufList);

        // 将读取的一行数据添加到集合
        bufList.add(employee);
        // 判断是不是达到缓存量了
        if (bufList.size() >= BATCH_COUNT) {
            // 操作数据库，将缓存的数据批量插入数据库中
            customerService.saveAll(bufList);
            System.out.println("插入"+bufList.size()+"条数据");
            bufList.clear();// 清空list缓存，释放内存，以便继续缓存后续数据
        }
    }

    // 读完整个Excel才会执行
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        // 处理最后剩下的几条数据（如果有），确保所有解析的数据都能插入数据库
        if (bufList.size() > 0) {
            customerService.saveAll(bufList);
            bufList.clear();
        }
    }
}